//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2022 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

import Foundation
import SotoCore

extension LicenseManagerUserSubscriptions {
    // MARK: Enums

    // MARK: Shapes

    public struct ActiveDirectoryIdentityProvider: AWSEncodableShape & AWSDecodableShape {
        /// The directory ID for an Active Directory identity provider.
        public let directoryId: String?

        public init(directoryId: String? = nil) {
            self.directoryId = directoryId
        }

        private enum CodingKeys: String, CodingKey {
            case directoryId = "DirectoryId"
        }
    }

    public struct AssociateUserRequest: AWSEncodableShape {
        /// The domain name of the user.
        public let domain: String?
        /// The identity provider of the user.
        public let identityProvider: IdentityProvider
        /// The ID of the EC2 instance, which provides user-based subscriptions.
        public let instanceId: String
        /// The user name from the identity provider for the user.
        public let username: String

        public init(domain: String? = nil, identityProvider: IdentityProvider, instanceId: String, username: String) {
            self.domain = domain
            self.identityProvider = identityProvider
            self.instanceId = instanceId
            self.username = username
        }

        private enum CodingKeys: String, CodingKey {
            case domain = "Domain"
            case identityProvider = "IdentityProvider"
            case instanceId = "InstanceId"
            case username = "Username"
        }
    }

    public struct AssociateUserResponse: AWSDecodableShape {
        /// Metadata that describes the associate user operation.
        public let instanceUserSummary: InstanceUserSummary

        public init(instanceUserSummary: InstanceUserSummary) {
            self.instanceUserSummary = instanceUserSummary
        }

        private enum CodingKeys: String, CodingKey {
            case instanceUserSummary = "InstanceUserSummary"
        }
    }

    public struct DeregisterIdentityProviderRequest: AWSEncodableShape {
        /// An object that specifies details for the identity provider.
        public let identityProvider: IdentityProvider
        /// The name of the user-based subscription product.
        public let product: String

        public init(identityProvider: IdentityProvider, product: String) {
            self.identityProvider = identityProvider
            self.product = product
        }

        private enum CodingKeys: String, CodingKey {
            case identityProvider = "IdentityProvider"
            case product = "Product"
        }
    }

    public struct DeregisterIdentityProviderResponse: AWSDecodableShape {
        /// Metadata that describes the results of an identity provider operation.
        public let identityProviderSummary: IdentityProviderSummary

        public init(identityProviderSummary: IdentityProviderSummary) {
            self.identityProviderSummary = identityProviderSummary
        }

        private enum CodingKeys: String, CodingKey {
            case identityProviderSummary = "IdentityProviderSummary"
        }
    }

    public struct DisassociateUserRequest: AWSEncodableShape {
        /// The domain name of the user.
        public let domain: String?
        /// An object that specifies details for the identity provider.
        public let identityProvider: IdentityProvider
        /// The ID of the EC2 instance, which provides user-based subscriptions.
        public let instanceId: String
        /// The user name from the identity provider for the user.
        public let username: String

        public init(domain: String? = nil, identityProvider: IdentityProvider, instanceId: String, username: String) {
            self.domain = domain
            self.identityProvider = identityProvider
            self.instanceId = instanceId
            self.username = username
        }

        private enum CodingKeys: String, CodingKey {
            case domain = "Domain"
            case identityProvider = "IdentityProvider"
            case instanceId = "InstanceId"
            case username = "Username"
        }
    }

    public struct DisassociateUserResponse: AWSDecodableShape {
        /// Metadata that describes the associate user operation.
        public let instanceUserSummary: InstanceUserSummary

        public init(instanceUserSummary: InstanceUserSummary) {
            self.instanceUserSummary = instanceUserSummary
        }

        private enum CodingKeys: String, CodingKey {
            case instanceUserSummary = "InstanceUserSummary"
        }
    }

    public struct Filter: AWSEncodableShape {
        /// The name of an attribute to use as a filter.
        public let attribute: String?
        /// The type of search (For example, eq, geq, leq)
        public let operation: String?
        /// Value of the filter.
        public let value: String?

        public init(attribute: String? = nil, operation: String? = nil, value: String? = nil) {
            self.attribute = attribute
            self.operation = operation
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case attribute = "Attribute"
            case operation = "Operation"
            case value = "Value"
        }
    }

    public struct IdentityProviderSummary: AWSDecodableShape {
        /// The failure message associated with an identity provider.
        public let failureMessage: String?
        /// An object that specifies details for the identity provider.
        public let identityProvider: IdentityProvider
        /// The name of the user-based subscription product.
        public let product: String
        /// An object that details the registered identity provider’s product related configuration settings such as the subnets to provision VPC endpoints.
        public let settings: Settings
        /// The status of an identity provider.
        public let status: String

        public init(failureMessage: String? = nil, identityProvider: IdentityProvider, product: String, settings: Settings, status: String) {
            self.failureMessage = failureMessage
            self.identityProvider = identityProvider
            self.product = product
            self.settings = settings
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case failureMessage = "FailureMessage"
            case identityProvider = "IdentityProvider"
            case product = "Product"
            case settings = "Settings"
            case status = "Status"
        }
    }

    public struct InstanceSummary: AWSDecodableShape {
        /// The ID of the EC2 instance, which provides user-based subscriptions.
        public let instanceId: String
        /// The date of the last status check.
        public let lastStatusCheckDate: String?
        /// A list of provided user-based subscription products.
        public let products: [String]
        /// The status of an EC2 instance resource.
        public let status: String
        /// The status message for an EC2 instance.
        public let statusMessage: String?

        public init(instanceId: String, lastStatusCheckDate: String? = nil, products: [String], status: String, statusMessage: String? = nil) {
            self.instanceId = instanceId
            self.lastStatusCheckDate = lastStatusCheckDate
            self.products = products
            self.status = status
            self.statusMessage = statusMessage
        }

        private enum CodingKeys: String, CodingKey {
            case instanceId = "InstanceId"
            case lastStatusCheckDate = "LastStatusCheckDate"
            case products = "Products"
            case status = "Status"
            case statusMessage = "StatusMessage"
        }
    }

    public struct InstanceUserSummary: AWSDecodableShape {
        /// The date a user was associated with an EC2 instance.
        public let associationDate: String?
        /// The date a user was disassociated from an EC2 instance.
        public let disassociationDate: String?
        /// The domain name of the user.
        public let domain: String?
        /// An object that specifies details for the identity provider.
        public let identityProvider: IdentityProvider
        /// The ID of the EC2 instance, which provides user-based subscriptions.
        public let instanceId: String
        /// The status of a user associated with an EC2 instance.
        public let status: String
        /// The status message for users of an EC2 instance.
        public let statusMessage: String?
        /// The user name from the identity provider for the user.
        public let username: String

        public init(associationDate: String? = nil, disassociationDate: String? = nil, domain: String? = nil, identityProvider: IdentityProvider, instanceId: String, status: String, statusMessage: String? = nil, username: String) {
            self.associationDate = associationDate
            self.disassociationDate = disassociationDate
            self.domain = domain
            self.identityProvider = identityProvider
            self.instanceId = instanceId
            self.status = status
            self.statusMessage = statusMessage
            self.username = username
        }

        private enum CodingKeys: String, CodingKey {
            case associationDate = "AssociationDate"
            case disassociationDate = "DisassociationDate"
            case domain = "Domain"
            case identityProvider = "IdentityProvider"
            case instanceId = "InstanceId"
            case status = "Status"
            case statusMessage = "StatusMessage"
            case username = "Username"
        }
    }

    public struct ListIdentityProvidersRequest: AWSEncodableShape {
        /// Maximum number of results to return in a single call.
        public let maxResults: Int?
        /// Token for the next set of results.
        public let nextToken: String?

        public init(maxResults: Int? = nil, nextToken: String? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct ListIdentityProvidersResponse: AWSDecodableShape {
        /// Metadata that describes the list identity providers operation.
        public let identityProviderSummaries: [IdentityProviderSummary]
        /// Token for the next set of results.
        public let nextToken: String?

        public init(identityProviderSummaries: [IdentityProviderSummary], nextToken: String? = nil) {
            self.identityProviderSummaries = identityProviderSummaries
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case identityProviderSummaries = "IdentityProviderSummaries"
            case nextToken = "NextToken"
        }
    }

    public struct ListInstancesRequest: AWSEncodableShape {
        /// An array of structures that you can use to filter the results to those that match one or more sets of key-value pairs that you specify.
        public let filters: [Filter]?
        /// Maximum number of results to return in a single call.
        public let maxResults: Int?
        /// Token for the next set of results.
        public let nextToken: String?

        public init(filters: [Filter]? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.filters = filters
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct ListInstancesResponse: AWSDecodableShape {
        /// Metadata that describes the list instances operation.
        public let instanceSummaries: [InstanceSummary]?
        /// Token for the next set of results.
        public let nextToken: String?

        public init(instanceSummaries: [InstanceSummary]? = nil, nextToken: String? = nil) {
            self.instanceSummaries = instanceSummaries
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case instanceSummaries = "InstanceSummaries"
            case nextToken = "NextToken"
        }
    }

    public struct ListProductSubscriptionsRequest: AWSEncodableShape {
        /// An array of structures that you can use to filter the results to those that match one or more sets of key-value pairs that you specify.
        public let filters: [Filter]?
        /// An object that specifies details for the identity provider.
        public let identityProvider: IdentityProvider
        /// Maximum number of results to return in a single call.
        public let maxResults: Int?
        /// Token for the next set of results.
        public let nextToken: String?
        /// The name of the user-based subscription product.
        public let product: String

        public init(filters: [Filter]? = nil, identityProvider: IdentityProvider, maxResults: Int? = nil, nextToken: String? = nil, product: String) {
            self.filters = filters
            self.identityProvider = identityProvider
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.product = product
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case identityProvider = "IdentityProvider"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case product = "Product"
        }
    }

    public struct ListProductSubscriptionsResponse: AWSDecodableShape {
        /// Token for the next set of results.
        public let nextToken: String?
        /// Metadata that describes the list product subscriptions operation.
        public let productUserSummaries: [ProductUserSummary]?

        public init(nextToken: String? = nil, productUserSummaries: [ProductUserSummary]? = nil) {
            self.nextToken = nextToken
            self.productUserSummaries = productUserSummaries
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case productUserSummaries = "ProductUserSummaries"
        }
    }

    public struct ListUserAssociationsRequest: AWSEncodableShape {
        /// An array of structures that you can use to filter the results to those that match one or more sets of key-value pairs that you specify.
        public let filters: [Filter]?
        /// An object that specifies details for the identity provider.
        public let identityProvider: IdentityProvider
        /// The ID of the EC2 instance, which provides user-based subscriptions.
        public let instanceId: String
        /// Maximum number of results to return in a single call.
        public let maxResults: Int?
        /// Token for the next set of results.
        public let nextToken: String?

        public init(filters: [Filter]? = nil, identityProvider: IdentityProvider, instanceId: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.filters = filters
            self.identityProvider = identityProvider
            self.instanceId = instanceId
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case identityProvider = "IdentityProvider"
            case instanceId = "InstanceId"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct ListUserAssociationsResponse: AWSDecodableShape {
        /// Metadata that describes the list user association operation.
        public let instanceUserSummaries: [InstanceUserSummary]?
        /// Token for the next set of results.
        public let nextToken: String?

        public init(instanceUserSummaries: [InstanceUserSummary]? = nil, nextToken: String? = nil) {
            self.instanceUserSummaries = instanceUserSummaries
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case instanceUserSummaries = "InstanceUserSummaries"
            case nextToken = "NextToken"
        }
    }

    public struct ProductUserSummary: AWSDecodableShape {
        /// The domain name of the user.
        public let domain: String?
        /// An object that specifies details for the identity provider.
        public let identityProvider: IdentityProvider
        /// The name of the user-based subscription product.
        public let product: String
        /// The status of a product for a user.
        public let status: String
        /// The status message for a product for a user.
        public let statusMessage: String?
        /// The end date of a subscription.
        public let subscriptionEndDate: String?
        /// The start date of a subscription.
        public let subscriptionStartDate: String?
        /// The user name from the identity provider of the user.
        public let username: String

        public init(domain: String? = nil, identityProvider: IdentityProvider, product: String, status: String, statusMessage: String? = nil, subscriptionEndDate: String? = nil, subscriptionStartDate: String? = nil, username: String) {
            self.domain = domain
            self.identityProvider = identityProvider
            self.product = product
            self.status = status
            self.statusMessage = statusMessage
            self.subscriptionEndDate = subscriptionEndDate
            self.subscriptionStartDate = subscriptionStartDate
            self.username = username
        }

        private enum CodingKeys: String, CodingKey {
            case domain = "Domain"
            case identityProvider = "IdentityProvider"
            case product = "Product"
            case status = "Status"
            case statusMessage = "StatusMessage"
            case subscriptionEndDate = "SubscriptionEndDate"
            case subscriptionStartDate = "SubscriptionStartDate"
            case username = "Username"
        }
    }

    public struct RegisterIdentityProviderRequest: AWSEncodableShape {
        /// An object that specifies details for the identity provider.
        public let identityProvider: IdentityProvider
        /// The name of the user-based subscription product.
        public let product: String
        /// The registered identity provider’s product related configuration settings such as the subnets to provision VPC endpoints.
        public let settings: Settings?

        public init(identityProvider: IdentityProvider, product: String, settings: Settings? = nil) {
            self.identityProvider = identityProvider
            self.product = product
            self.settings = settings
        }

        public func validate(name: String) throws {
            try self.settings?.validate(name: "\(name).settings")
        }

        private enum CodingKeys: String, CodingKey {
            case identityProvider = "IdentityProvider"
            case product = "Product"
            case settings = "Settings"
        }
    }

    public struct RegisterIdentityProviderResponse: AWSDecodableShape {
        /// Metadata that describes the results of an identity provider operation.
        public let identityProviderSummary: IdentityProviderSummary

        public init(identityProviderSummary: IdentityProviderSummary) {
            self.identityProviderSummary = identityProviderSummary
        }

        private enum CodingKeys: String, CodingKey {
            case identityProviderSummary = "IdentityProviderSummary"
        }
    }

    public struct Settings: AWSEncodableShape & AWSDecodableShape {
        /// A security group ID that allows inbound TCP port 1688 communication between resources in your VPC and the VPC endpoint for activation servers.
        public let securityGroupId: String
        /// The subnets defined for the registered identity provider.
        public let subnets: [String]

        public init(securityGroupId: String, subnets: [String]) {
            self.securityGroupId = securityGroupId
            self.subnets = subnets
        }

        public func validate(name: String) throws {
            try self.validate(self.securityGroupId, name: "securityGroupId", parent: name, max: 200)
            try self.validate(self.securityGroupId, name: "securityGroupId", parent: name, min: 5)
            try self.validate(self.securityGroupId, name: "securityGroupId", parent: name, pattern: "^sg-(([0-9a-z]{8})|([0-9a-z]{17}))$")
            try self.subnets.forEach {
                try validate($0, name: "subnets[]", parent: name, pattern: "subnet-[a-z0-9]{8,17}")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case securityGroupId = "SecurityGroupId"
            case subnets = "Subnets"
        }
    }

    public struct StartProductSubscriptionRequest: AWSEncodableShape {
        /// The domain name of the user.
        public let domain: String?
        /// An object that specifies details for the identity provider.
        public let identityProvider: IdentityProvider
        /// The name of the user-based subscription product.
        public let product: String
        /// The user name from the identity provider of the user.
        public let username: String

        public init(domain: String? = nil, identityProvider: IdentityProvider, product: String, username: String) {
            self.domain = domain
            self.identityProvider = identityProvider
            self.product = product
            self.username = username
        }

        private enum CodingKeys: String, CodingKey {
            case domain = "Domain"
            case identityProvider = "IdentityProvider"
            case product = "Product"
            case username = "Username"
        }
    }

    public struct StartProductSubscriptionResponse: AWSDecodableShape {
        /// Metadata that describes the start product subscription operation.
        public let productUserSummary: ProductUserSummary

        public init(productUserSummary: ProductUserSummary) {
            self.productUserSummary = productUserSummary
        }

        private enum CodingKeys: String, CodingKey {
            case productUserSummary = "ProductUserSummary"
        }
    }

    public struct StopProductSubscriptionRequest: AWSEncodableShape {
        /// The domain name of the user.
        public let domain: String?
        /// An object that specifies details for the identity provider.
        public let identityProvider: IdentityProvider
        /// The name of the user-based subscription product.
        public let product: String
        /// The user name from the identity provider for the user.
        public let username: String

        public init(domain: String? = nil, identityProvider: IdentityProvider, product: String, username: String) {
            self.domain = domain
            self.identityProvider = identityProvider
            self.product = product
            self.username = username
        }

        private enum CodingKeys: String, CodingKey {
            case domain = "Domain"
            case identityProvider = "IdentityProvider"
            case product = "Product"
            case username = "Username"
        }
    }

    public struct StopProductSubscriptionResponse: AWSDecodableShape {
        /// Metadata that describes the start product subscription operation.
        public let productUserSummary: ProductUserSummary

        public init(productUserSummary: ProductUserSummary) {
            self.productUserSummary = productUserSummary
        }

        private enum CodingKeys: String, CodingKey {
            case productUserSummary = "ProductUserSummary"
        }
    }

    public struct UpdateIdentityProviderSettingsRequest: AWSEncodableShape {
        public let identityProvider: IdentityProvider
        /// The name of the user-based subscription product.
        public let product: String
        /// Updates the registered identity provider’s product related configuration settings. You can update any combination of settings in a single operation such as the:   Subnets which you want to add to provision VPC endpoints.   Subnets which you want to remove the VPC endpoints from.   Security group ID which permits traffic to the VPC endpoints.
        public let updateSettings: UpdateSettings

        public init(identityProvider: IdentityProvider, product: String, updateSettings: UpdateSettings) {
            self.identityProvider = identityProvider
            self.product = product
            self.updateSettings = updateSettings
        }

        public func validate(name: String) throws {
            try self.updateSettings.validate(name: "\(name).updateSettings")
        }

        private enum CodingKeys: String, CodingKey {
            case identityProvider = "IdentityProvider"
            case product = "Product"
            case updateSettings = "UpdateSettings"
        }
    }

    public struct UpdateIdentityProviderSettingsResponse: AWSDecodableShape {
        public let identityProviderSummary: IdentityProviderSummary

        public init(identityProviderSummary: IdentityProviderSummary) {
            self.identityProviderSummary = identityProviderSummary
        }

        private enum CodingKeys: String, CodingKey {
            case identityProviderSummary = "IdentityProviderSummary"
        }
    }

    public struct UpdateSettings: AWSEncodableShape {
        /// The ID of one or more subnets in which License Manager will create a VPC endpoint for products that require connectivity to activation servers.
        public let addSubnets: [String]
        /// The ID of one or more subnets to remove.
        public let removeSubnets: [String]
        /// A security group ID that allows inbound TCP port 1688 communication between resources in your VPC and the VPC endpoints for activation servers.
        public let securityGroupId: String?

        public init(addSubnets: [String], removeSubnets: [String], securityGroupId: String? = nil) {
            self.addSubnets = addSubnets
            self.removeSubnets = removeSubnets
            self.securityGroupId = securityGroupId
        }

        public func validate(name: String) throws {
            try self.addSubnets.forEach {
                try validate($0, name: "addSubnets[]", parent: name, pattern: "subnet-[a-z0-9]{8,17}")
            }
            try self.removeSubnets.forEach {
                try validate($0, name: "removeSubnets[]", parent: name, pattern: "subnet-[a-z0-9]{8,17}")
            }
            try self.validate(self.securityGroupId, name: "securityGroupId", parent: name, max: 200)
            try self.validate(self.securityGroupId, name: "securityGroupId", parent: name, min: 5)
            try self.validate(self.securityGroupId, name: "securityGroupId", parent: name, pattern: "^sg-(([0-9a-z]{8})|([0-9a-z]{17}))$")
        }

        private enum CodingKeys: String, CodingKey {
            case addSubnets = "AddSubnets"
            case removeSubnets = "RemoveSubnets"
            case securityGroupId = "SecurityGroupId"
        }
    }

    public struct IdentityProvider: AWSEncodableShape & AWSDecodableShape {
        /// An object that details an Active Directory identity provider.
        public let activeDirectoryIdentityProvider: ActiveDirectoryIdentityProvider?

        public init(activeDirectoryIdentityProvider: ActiveDirectoryIdentityProvider? = nil) {
            self.activeDirectoryIdentityProvider = activeDirectoryIdentityProvider
        }

        private enum CodingKeys: String, CodingKey {
            case activeDirectoryIdentityProvider = "ActiveDirectoryIdentityProvider"
        }
    }
}

// MARK: - Errors

/// Error enum for LicenseManagerUserSubscriptions
public struct LicenseManagerUserSubscriptionsErrorType: AWSErrorType {
    enum Code: String {
        case accessDeniedException = "AccessDeniedException"
        case conflictException = "ConflictException"
        case internalServerException = "InternalServerException"
        case resourceNotFoundException = "ResourceNotFoundException"
        case serviceQuotaExceededException = "ServiceQuotaExceededException"
        case throttlingException = "ThrottlingException"
        case validationException = "ValidationException"
    }

    private let error: Code
    public let context: AWSErrorContext?

    /// initialize LicenseManagerUserSubscriptions
    public init?(errorCode: String, context: AWSErrorContext) {
        guard let error = Code(rawValue: errorCode) else { return nil }
        self.error = error
        self.context = context
    }

    internal init(_ error: Code) {
        self.error = error
        self.context = nil
    }

    /// return error code string
    public var errorCode: String { self.error.rawValue }

    /// You don&#39;t have sufficient access to perform this action.
    public static var accessDeniedException: Self { .init(.accessDeniedException) }
    /// The request couldn&#39;t be completed because it conflicted with the current state of the resource.
    public static var conflictException: Self { .init(.conflictException) }
    /// An exception occurred with the service.
    public static var internalServerException: Self { .init(.internalServerException) }
    /// The resource couldn&#39;t be found.
    public static var resourceNotFoundException: Self { .init(.resourceNotFoundException) }
    /// The request failed because a service quota is exceeded.
    public static var serviceQuotaExceededException: Self { .init(.serviceQuotaExceededException) }
    /// The request was denied because of request throttling. Retry the request.
    public static var throttlingException: Self { .init(.throttlingException) }
    /// A parameter is not valid.
    public static var validationException: Self { .init(.validationException) }
}

extension LicenseManagerUserSubscriptionsErrorType: Equatable {
    public static func == (lhs: LicenseManagerUserSubscriptionsErrorType, rhs: LicenseManagerUserSubscriptionsErrorType) -> Bool {
        lhs.error == rhs.error
    }
}

extension LicenseManagerUserSubscriptionsErrorType: CustomStringConvertible {
    public var description: String {
        return "\(self.error.rawValue): \(self.message ?? "")"
    }
}
